#ifndef JSON_H
#define JSON_H

#include <json_spirit_reader_template.h>

#include "Vector2.h"
#include "GameInfo.h"
#include "Commands.h"
#include "Handshaking.h"

std::string toJSON(const ConnectServer& object);
std::string toJSON(const ConnectClient& object);
std::string toJSON(const Command& object);
std::string toJSON(const DefendCommand& object);
std::string toJSON(const AttackCommand& object);
std::string toJSON(const MoveCommand& object);
std::string toJSON(const ChargeCommand& object);


template <typename T>
std::unique_ptr<T> fromJSON(const json_spirit::mValue& value);

template <>
std::unique_ptr<ConnectServer> fromJSON<>(const json_spirit::mValue& value);
template <>
std::unique_ptr<ConnectClient> fromJSON<>(const json_spirit::mValue& value);

template <>
std::unique_ptr<LevelInfo> fromJSON<>(const json_spirit::mValue& value);
template <>
std::unique_ptr<GameInfo> fromJSON<>(const json_spirit::mValue& value);
template <>
std::unique_ptr<TeamInfo> fromJSON<>(const json_spirit::mValue& value);
template <>
std::unique_ptr<BotInfo> fromJSON<>(const json_spirit::mValue& value);
template <>
std::unique_ptr<FlagInfo> fromJSON<>(const json_spirit::mValue& value);
template <>
std::unique_ptr<MatchInfo> fromJSON<>(const json_spirit::mValue& value);
template <>
std::unique_ptr<MatchCombatEvent> fromJSON<>(const json_spirit::mValue& value);


void fixupGameInfoReferences(GameInfo& gameInfo);


void mergeGameInfo(GameInfo& gameInfo, GameInfo& newGameInfo);


#endif // JSON_H
